// using System.Collections;
// using System.Collections.Generic;
// using System.Net.Sockets;
// using System.Net;
// using System;
// using Newtonsoft.Json;  //引用命名空间


// public static class NetManager
// {
//     static Socket socket;
//     static byte[] readBuff = new byte[1024];

//     // 委托类型
//     public delegate void MsgListener(String str);

//     // 监听列表
//     private static Dictionary<string, MsgListener> listeners = new Dictionary<string, MsgListener>();

//     static List<String> msgList = new List<string>();

//     // 添加监听
//     public static void AddListener(string msgName, MsgListener listener)
//     {
//         // Debug.Log("add_listener---" + msgName);
//         listeners[msgName] = listener;
//     }

//     // 获取描述
//     public static string GetDesc()
//     {
//         if (socket == null) return "";
//         if (!socket.Connected) return "";
//         return socket.LocalEndPoint.ToString();
//     }

//     // 连接
//     public static void Connect(string ip, int port)
//     {
//         // Socket
//         socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//         // 绑定端口
//         // int bind_port = BdUtils.TimeUtils.get_random_number(8800, 8900);
//         // socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), bind_port));
//         // Connect (用同步方式简化代码)
//         socket.Connect(ip, port);
//         // BeginRecieve
//         socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);
//         Debug.Log("--- 成建立功连接: " + ip + ':' + port);
//     }

//     public static void Close()
//     {
//         socket.Close();
//     }

//     // Receive回调
//     private static void ReceiveCallback(IAsyncResult ar)
//     {
//         try
//         {
//             Socket socket = (Socket)ar.AsyncState;
//             int count = socket.EndReceive(ar);
//             string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
//             // Debug.Log("---------recvStr: " + recvStr);
//             msgList.Add(recvStr);
//             // Debug.Log("~~~Count " + msgList.Count);   // dbg
//             socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);
//         }
//         catch (SocketException ex)
//         {
//             Debug.Log("Socket Receive fail " + ex.ToString());
//             // socket.Close();
//         }
//     }

//     // 发送
//     public static void Send(string sendStr)
//     {
//         if (socket == null) return;
//         if (!socket.Connected) return;

//         byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);
//         socket.Send(sendBytes);
//         // socket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallback, socket);
//     }

//     public static void SendCallback(IAsyncResult ar)
//     {
//         try
//         {
//             Socket socket = (Socket)ar.AsyncState;
//             int count = socket.EndSend(ar);
//             Debug.Log("Socket Send succ" + count);
//         }
//         catch (SocketException ex)
//         {
//             Debug.Log("Socket Send fail" + ex.ToString());
//         }
//     }

//     // Update
//     public static void Update()
//     {
//         BdUtils.log("~~~ NetManager.Update");

//         if (msgList.Count <= 0) return;
//         String msgStr = msgList[0];
//         BdUtils.log($"*** msgStr: {msgStr}");

//         msgList.RemoveAt(0);

//         // --- 旧版使用`listeners`
//         var msg = (MsgBase)MsgBase.Decode("MsgBase", msgStr);
//         string msgName = msg.protoName;
//         string msgArgs = msg.ToString();
//         BdUtils.log("--- msg: ", msg);

//         // 监听回调
//         if (listeners.ContainsKey(msgName))
//         {
//             listeners[msgName](msgArgs);
//         }
//         else
//         {
//             Debug.Log($"\n! --- 协议头出错: [{msgName}], --- msg body: [{msgStr}]\n");
//             BdUtils.log(listeners);
//         }

//         // --- 新版使用`MsgHandle`类
//         // MsgHandle.run_method_by_msg(msgStr);
//     }
// }
